#ifndef NETLIB_LOGFILE_H
#define NETLIB_LOGFILE_H

// 日志文件类

#include "Mutex.h"
#include "Types.h"

#include <memory>

namespace netlib
{

namespace FileUtil
{
    class AppendFile;

} // namespace FileUtil end

class LogFile : noncopyable // 不可拷贝
{
public:
    LogFile(const string& basename,
            off_t rollSize,
            bool threadSafe = true,
            int flushInterval = 3,
            int checkEveryN = 1024);
    ~LogFile();

    void append(const char* logline, int len);

    void flush();
    
    bool rollFile();

private:
    void append_unlocked(const char* logline, int len);

    static string getLogFileName(const string& basename, time_t* now);

    const string basename_;             // 日志文件名
    const off_t rollSize_;              // 日志文件大小上限，超过则新建一个文件
    const int flushInterval_;           // 日志写入间隔时间
    const int checkEveryN_;             // 判断是否滚动日志的标志

    int count_;                         // 计数器

    std::unique_ptr<MutexLock> mutex_;  // 智能指针管理的互斥锁
    time_t startOfPeriod_;              // 日志开始写入的时间（调整至零点-秒数）
    time_t lastRoll_;                   // 上一次滚动日志的时间
    time_t lastFlush_;                  // 上一次日志写入的时间
    std::unique_ptr<FileUtil::AppendFile> file_; // 文件管理类指针

    const static int kRollPerSeconds_ = 60*60*24; // 一天的秒数
};

} // namespace netlib end
#endif